package jm.nj.demo13mian.demo10;

/*
* 解决线程安全问题的第二种同步方式:同步方法
* 1.把访问共享数据的代码,提取出来放在一个方法中
* 2.在方法上增加同步关键字synchronized
*
* 修饰符  synchronized 返回值类型  方法名(参数列表)
*       出现了安全问题的代码
*       (使用了共享数据代码)
* }
*
* 同步方法的锁对象:是本类对象引用this(Runnable)
*
* 方法可以有静态方法
* 静态方法的锁对象是本类对象的class属性(反射)
* RunnableImpl.class
* */
public class RunnableImpl implements Runnable {
    //定义共享票源
    private int ticket = 10;
    private static int ticket1=10;
    @Override
    public  void run() {
        //设置死循环,让3个线程买票,重复执行
        while (true) {
            //synchronized (obj){

            //payTicket01();
            payTicket02();
            //}
        }

    }
/*
*
* */
    private static synchronized void payTicket02() {
        if (ticket1 > 0) {
            try {
                Thread.sleep(10);

            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println(Thread.currentThread().getName() + "...正在买第" + ticket1-- + "张票");

        }
    }
    /*
     * 在放上增加了synchronized关键字的方法,就是同步方法
     */
    private synchronized void payTicket01() {
        if (ticket > 0) {
            try {
                Thread.sleep(10);

            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println(Thread.currentThread().getName() + "...正在买第" + ticket-- + "张票");

        }
    }


}
